/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.proyecto.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.controlador.MaterialControlador;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.proyecto.bean.DevolucionProyecto;
import sv.com.intesal.proyecto.sql.SQLDevolucionProyecto;
import sv.com.intesal.seguridad.bean.ParametroSicopi;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.ParametroSicopiControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author JM
 */
public class DevolucionProyectoControlador {

    public void setEnca(DevolucionProyecto dp, List<DevolucionProyecto> listaDp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        SessionControlador sc = new SessionControlador();
        ParametroSicopiControlador pc = new ParametroSicopiControlador();
        ParametroSicopi pp = pc.getParametroSicopi("DEVOLUCION_PROYECTO");
        try {

            cnn = cConexion.conectar();
            if (dp.getId_dp() == null) {

                ps = cnn.prepareStatement(SQLDevolucionProyecto.insertDevolucionENCA);
                ps.setInt(1, dp.getId_e());
                ps.setInt(2, dp.getId_p());
                ps.setInt(3, sc.getCodigo_Usuario());
                ps.setDate(4, cVarios.getFecha(dp.getFecha_dp()));
                ps.setInt(5, pp.getCorrelativo_ps());
                ps.setInt(6, pp.getBloque_ps());
                ps.setString(7, dp.getObservacion());
                ps.executeUpdate();
                ps.close();

                pc.updateCorrelativo("DEVOLUCION_PROYECTO");
                dp.setNumero_documento_dp(pp.getCorrelativo_ps());//ASIGNAR BLOQUE

            } else {

                ps = cnn.prepareStatement(SQLDevolucionProyecto.insertDevolucionENCA_Modificacion);
                ps.setInt(1, dp.getId_e());
                ps.setInt(2, dp.getId_p());
                ps.setDate(3, cVarios.getFecha(dp.getFecha_dp()));
                ps.setInt(4, dp.getNumero_documento_dp());
                ps.setString(5, dp.getObservacion());
                ps.setInt(6, dp.getId_dp());
                ps.executeUpdate();
                ps.close();

            }
            this.setDeta(dp, listaDp);

            //cnn.commit();
            cnn.close();

            Mensaje m = new Mensaje();
            if (dp.getId_dp() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            //cnn.rollback();
            throw new Exception(e);
        }
    }

    public void setDeta(DevolucionProyecto dp, List<DevolucionProyecto> listaDp) throws Exception {
        try {

            Integer codigo_dp = dp.getId_dp();
            if (dp.getId_dp() == null) {
                codigo_dp = this.getMax();
                this.cambiarEstado("AC", codigo_dp);
            }
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listaDp.size(); i++) {
                if (listaDp.get(i).getId_d() == 0) { //SI SOLO ES UN NUEVO REGISTRO
                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLDevolucionProyecto.insertDevolucionDETA);

                    ps.setInt(1, listaDp.get(i).getId_dm());
                    ps.setInt(2, codigo_dp);
                    ps.setDouble(3, listaDp.get(i).getCantidad_d());
                    ps.executeUpdate();
                    ps.close();
                    cnn.close();

                    /* AUMENTAR CANTIDAD DE MATERIAL */
                    mc.setCantidadMaterial_Aumentar_Disminuir(codigo_dp, listaDp.get(i).getId_dm(), listaDp.get(i).getCantidad_d(), "A", bc.ingresarDevolucionProyecto + ": " + dp.getNumero_documento_dp(), dp.getNumero_documento_dp().toString(), bc.ingresarDevolucionProyecto);
                }
            }

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLDevolucionProyecto.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionProyecto> getConsulta_DevolucionProyecto(DevolucionProyecto dp) throws Exception {
        List<DevolucionProyecto> lista = new ArrayList<DevolucionProyecto>();

        try {
            ResultSet rs = null;
            PreparedStatement ps = null;
            Connection cnn = null;

            cnn = cConexion.conectar();

            String var_estado = " and dp.estado_dp='AC' ";
            String var_fechas = this.getFiltro_Fechas(dp);
            String var_proyecto = " and p.id_p=" + dp.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + dp.getId_cl();

            if (dp.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            if (dp.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (dp.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT * FROM CLIENTE as cl, PROYECTO as p,DEVOLUCION_PROYECTO as dp,EMPLEADO as e where e.id_e=dp.id_e and cl.id_c=p.id_c and p.id_p=dp.id_p "
                    + var_estado + var_fechas + var_proyecto + var_cliente + "  order by cl.id_c,dp.fecha_dp,dp.numero_documento_dp";
            //System.out.println("sql= " + sql);

            ps = cnn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                DevolucionProyecto dP = new DevolucionProyecto();

                /*DEVOLUCION PROYECTO*/
                dP.setFecha_dp(rs.getDate("fecha_dp"));
                dP.setId_dp(rs.getInt("id_dp"));
                dP.setObservacion(rs.getString("observacion_dp"));
                dP.setNumero_documento_dp(rs.getInt("numero_documento_dp"));
                dP.setBloque_dp(rs.getInt("bloque_dp"));
                dP.setFechahora(rs.getTimestamp("fechahora"));
                dP.setEstado_dp(rs.getString("estado_dp"));

                /*EMPLEADO*/
                dP.setApellido_e(rs.getString("apellido_e"));
                dP.setNombre_e(rs.getString("nombre_e"));
                dP.setNombre_completo_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));
                dP.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                dP.setId_cl(rs.getInt("id_c"));
                dP.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                dP.setId_p(rs.getInt("id_p"));
                dP.setNombre_p(rs.getString("nombre_p"));
                lista.add(dP);
            }

            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionProyecto> getDetaDevolucionProyecto(Integer codigo_dp) throws Exception {

        List<DevolucionProyecto> lista = new ArrayList<DevolucionProyecto>();
        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection cnn = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.getDevolucionProyecto);
            ps.setInt(1, codigo_dp);
            rs = ps.executeQuery();

            while (rs.next()) {
                DevolucionProyecto dp = new DevolucionProyecto();
                /*DEVOLUCION PROYECTO*/
                dp.setFecha_dp(rs.getDate("fecha_dp"));
                dp.setId_dp(rs.getInt("id_dp"));
                dp.setObservacion(rs.getString("observacion_dp"));
                dp.setNumero_documento_dp(rs.getInt("numero_documento_dp"));
                dp.setEstado_dp(rs.getString("estado_dp"));
                dp.setBloque_dp(rs.getInt("bloque_dp"));

                /*EMPLEADO*/
                dp.setApellido_e(rs.getString("apellido_e"));
                dp.setNombre_e(rs.getString("nombre_e"));
                dp.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                dp.setId_cl(rs.getInt("id_c"));
                dp.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                dp.setId_p(rs.getInt("id_p"));
                dp.setNombre_p(rs.getString("nombre_p"));

                /*DETA_DEVOLUCION*/
                dp.setId_dm(rs.getInt("id_dm"));
                dp.setId_d(rs.getInt("id_d"));
                dp.setCantidad_d(rs.getDouble("cantidad_d"));
                dp.setNombre_m(rs.getString("nombre_m"));

                /*MATERIAL*/
                lista.add(dp);
            }

            cnn.close();
            rs.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularDevolucionProyecto(List<DevolucionProyecto> listDP) throws Exception {
        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listDP.size(); i++) {
                mc.setCantidadMaterial_Aumentar_Disminuir(listDP.get(0).getId_dp(), listDP.get(i).getId_dm(), listDP.get(i).getCantidad_d(), "D", bc.anulacionDevolucionProyecto + ": " + listDP.get(0).getNumero_documento_dp(), listDP.get(0).getNumero_documento_dp().toString(), bc.anulacionDevolucionProyecto);
            }
            bc.setBitacoraAnulacion(listDP.get(0).getId_dp(), bc.anulacionDevolucionProyecto + ": " + listDP.get(0).getNumero_documento_dp(), bc.anulacionDevolucionProyecto);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());

            this.cambiarEstado("A", listDP.get(0).getId_dp());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarDevolucion(List<DevolucionProyecto> listDP) throws Exception {
        try {
            MaterialControlador mc = new MaterialControlador();
            for (int i = 0; i < listDP.size(); i++) {
                if (mc.validar_cantidad(listDP.get(i).getId_dm(), listDP.get(i).getCantidad_d()) == false) {
                    return false;
                }
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public Boolean validar_ItemEliminarDevolucion(DevolucionProyecto dp) throws Exception {

        try {
            MaterialControlador mc = new MaterialControlador();

            if (mc.validar_cantidad(dp.getId_dm(), dp.getCantidad_d()) == false) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public void cambiarEstado(String estado, Integer codigo_dp) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.cambiarEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_dp);
            ps.executeUpdate();

            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarItem(DevolucionProyecto dp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            cnn = cConexion.conectar();
            //cnn.setAutoCommit(false);
            ps = cnn.prepareStatement(SQLDevolucionProyecto.setEliminarDeta);
            ps.setInt(1, dp.getId_d());
            ps.executeUpdate();

            mc.setCantidadMaterial_Aumentar_Disminuir(dp.getId_dp(), dp.getId_dm(), dp.getCantidad_d(), "D", bc.eliminarItemDevolucionProyecto + ": " + dp.getNumero_documento_dp(), dp.getNumero_documento_dp().toString(), bc.eliminarItemDevolucionProyecto);
            bc.setBitacoraAnulacion(dp.getId_dp(), bc.eliminarItemDevolucionProyecto + ": " + dp.getNumero_documento_dp(), bc.eliminarItemDevolucionProyecto);

            //cnn.rollback();
            ps.close();
            cnn.close();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());

//            if (cnn.getAutoCommit() != false) {
//                cnn.commit();
//            }
        } catch (Exception e) {
            //cnn.rollback();
            throw new Exception(e);
        }
    }

    public DevolucionProyecto getEnca(Integer codigo_dp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.getEncaDP);
            ps.setInt(1, codigo_dp);
            rs = ps.executeQuery();
            rs.next();

            DevolucionProyecto dp = new DevolucionProyecto();

            dp.setId_dp(rs.getInt("id_dp"));
            dp.setId_e(rs.getInt("id_e"));
            dp.setId_p(rs.getInt("id_p"));

            dp.setId_u(rs.getInt("id_u"));
            dp.setFecha_dp(rs.getDate("fecha_dp"));
            dp.setFechahora(rs.getTimestamp("fechahora"));

            dp.setObservacion(rs.getString("observacion_dp"));
            dp.setEstado_dp(rs.getString("estado_dp"));
            dp.setNumero_documento_dp(rs.getInt("numero_documento_dp"));
            dp.setBloque_dp(rs.getInt("bloque_dp"));

            cnn.close();
            ps.close();
            rs.close();

            return dp;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionProyecto> getDeta(Integer codigo_dp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            List<DevolucionProyecto> lista = new ArrayList<DevolucionProyecto>();

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.getDetaDp);
            ps.setInt(1, codigo_dp);
            rs = ps.executeQuery();

            while (rs.next()) {
                DevolucionProyecto dp = new DevolucionProyecto();
                dp.setId_d(rs.getInt("id_d"));
                dp.setId_dm(rs.getInt("id_dm"));

                dp.setNombre_m(rs.getString("nombre_m"));
                dp.setCantidad_d(rs.getDouble("cantidad_d"));
                lista.add(dp);
            }

            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarDevolucionProyecto(DevolucionProyecto dp) throws Exception {

        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(dp.getId_dp(), RutaProyecto.wfrmDevolucionProyecto);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarCantidad_AnularDevolucionProyecto(Integer codigo_dp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Boolean var_return = true;

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.validarCantidadAnular);
            ps.setInt(1, codigo_dp);
            rs = ps.executeQuery();

            Mensaje m = new Mensaje();
            MaterialControlador mc = new MaterialControlador();
            while (rs.next()) {
                if (mc.validar_cantidad(rs.getInt("id_dm"), rs.getDouble("suma")) == false) {
                    var_return = false;
                    //m.messageAdvertencia("id_dm=" + rs.getInt("id_dm") + ", suma=" + rs.getDouble("suma") + ": " + rs.getString("nombre_m"));
                    m.messageAdvertencia(m.getIcantidad() + ": " + rs.getString("nombre_m"));
                }
            }
            ps.close();
            rs.close();
            cnn.close();

            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionProyecto> getDevolucionProyecto_x_Proyecto(Integer codigo_p) throws Exception {

        List<DevolucionProyecto> lista = new ArrayList<DevolucionProyecto>();

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionProyecto.getEncaDP_x_Proyecto);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();
            while (rs.next()) {
                DevolucionProyecto dp = new DevolucionProyecto();

                /*DEVOLUCION PROYECTO*/
                dp.setFecha_dp(rs.getDate("fecha_dp"));
                dp.setId_dp(rs.getInt("id_dp"));
                dp.setObservacion(rs.getString("observacion_dp"));
                dp.setNumero_documento_dp(rs.getInt("numero_documento_dp"));
                dp.setBloque_dp(rs.getInt("bloque_dp"));
                dp.setFechahora(rs.getTimestamp("fechahora"));
                dp.setEstado_dp(rs.getString("estado_dp"));

                /*EMPLEADO*/
                dp.setApellido_e(rs.getString("apellido_e"));
                dp.setNombre_e(rs.getString("nombre_e"));
                dp.setNombre_completo_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));
                dp.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                dp.setId_cl(rs.getInt("id_c"));
                dp.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                dp.setId_p(rs.getInt("id_p"));
                dp.setNombre_p(rs.getString("nombre_p"));
                lista.add(dp);
            }
            cnn.close();
            ps.close();
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(DevolucionProyecto dp) {
        try {
            String var_fechas = " ";
            if (dp.getFecha_i() != null && dp.getFecha_f() == null) {
                var_fechas = " and dp.fecha_dp >='" + cVarios.getFecha(dp.getFecha_i()) + "' ";
            } else if (dp.getFecha_f() != null && dp.getFecha_i() == null) {
                var_fechas = " and dp.fecha_dp <='" + cVarios.getFecha(dp.getFecha_f()) + "' ";
            } else if (dp.getFecha_i() == null && dp.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and dp.fecha_dp between '" + cVarios.getFecha(dp.getFecha_i()) + "' and '" + cVarios.getFecha(dp.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            return " ";
        }
    }

    /*REPORTES*/
    public void generarReporte_Detalle(DevolucionProyecto dp) throws Exception {
        /*GENERAR REPROTE PARA UNA DEVOLUCION DE PROYECTO.*/
        try {

            String sql = "SELECT s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,dp.fecha_dp,dp.fechahora,dp.observacion_dp, dp.bloque_dp,dp.numero_documento_dp,m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp FROM CLIENTE as cl, PROYECTO as p,DEVOLUCION_PROYECTO as dp,DETA_DEVOLUCION_PROYECTO as d,EMPLEADO as e, MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s where m.id_m=ms.id_m and ms.id_dm=d.id_dm and e.id_e=dp.id_e and cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and p.id_p=dp.id_p and dp.id_dp=d.id_dp  and s.codigo_s=ms.codigo_s "
                    + " and dp.id_dp=" + dp.getId_dp() + " order by cl.id_c,dp.fecha_dp,dp.numero_documento_dp";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Enca(DevolucionProyecto dp) throws Exception {

        try {
            String var_estado = " and dp.estado_dp='AC' ";
            String var_fechas = this.getFiltro_Fechas(dp);
            String var_proyecto = " and p.id_p=" + dp.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + dp.getId_cl();

            if (dp.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            if (dp.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (dp.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,dp.fecha_dp,dp.fechahora,dp.observacion_dp, dp.bloque_dp,dp.numero_documento_dp,m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp FROM CLIENTE as cl, PROYECTO as p,DEVOLUCION_PROYECTO as dp,DETA_DEVOLUCION_PROYECTO as d,EMPLEADO as e, MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s where m.id_m=ms.id_m and ms.id_dm=d.id_dm and e.id_e=dp.id_e and cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and p.id_p=dp.id_p and dp.id_dp=d.id_dp  and s.codigo_s=ms.codigo_s "
                    + var_fechas + var_cliente + var_proyecto + var_estado + " order by cl.id_c,dp.fecha_dp,dp.numero_documento_dp";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
